package com.king;

import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import com.king.event.AppEvent;
import com.king.pages.main.MainWin;

import atlantafx.base.theme.PrimerDark;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import net.rgielen.fxweaver.core.FxWeaver;

/**
 * spring初始化完成，之前使用 implements ApplicationListener<AppEvt>
 * 这种方式，但是目前我们知道这个是一种事件，那么其实可以换成EventListener的方式
 * 
 * @author king
 * @date 2025年6月18日-16:14:02
 */
@Component
public class SpringInitOk {

	@Autowired
	private FxWeaver fxWeaver;

	private Stage stage;
	private StackPane root;

	private double offsetX = 0;
	private double offsetY = 0;

	@EventListener
	public void onApplicationEvent(AppEvent event) {
		stage = event.getStage();

		stage.initStyle(StageStyle.TRANSPARENT);
		// 引用了atlantfx的主题
		Application.setUserAgentStylesheet(new PrimerDark().getUserAgentStylesheetBSS());

		root = fxWeaver.loadView(MainWin.class);
		root.getStylesheets().add("/css/style.css");
		stage.getIcons().clear();
		stage.getIcons().add(new Image(getClass().getResourceAsStream(App.ICON)));
		// 将背景设置成透明度为0.9
		root.setStyle("-fx-background-color: #000000E6");
		Scene scene = new Scene(root, -1, -1, Color.TRANSPARENT);
		stage.setScene(scene);
		stage.setTitle("king mind");
		stage.show();
	}

	/**
	 * 拖动窗体
	 * 
	 * @param node 拖动的组件Node
	 * @author king
	 * @date 2025年6月23日-13:57:05
	 */
	public void dragWin(Node node) {
		Objects.requireNonNull(node, "拖拽的节点不能为空");
		// 设置拖动事件
		node.setOnMousePressed(event -> {
			offsetX = event.getSceneX();
			offsetY = event.getSceneY();
		});
		node.setOnMouseDragged(event -> {
			stage.setX(event.getScreenX() - offsetX);
			stage.setY(event.getScreenY() - offsetY);
		});
	}

	/**
	 * 最大化，或还原
	 * 
	 * @author king
	 * @date 2025年6月23日-14:39:01
	 */
	public void maximize() {
		stage.setMaximized(!stage.maximizedProperty().get());
	}

	/**
	 * 最小化
	 * 
	 * @author king
	 * @date 2025年6月23日-14:57:03
	 */
	public void minimize() {
		stage.setIconified(true);
	}

	/**
	 * 获取舞台的宽度
	 * 
	 * @return
	 * @author king
	 * @date 2025年7月8日-14:05:34
	 */
	public double getStageWidth() {
		return stage.getWidth();
	}

	public Stage getStage() {
		return stage;
	}

	public StackPane getRoot() {
		return this.root;
	}
}
